Circuit Breaker是我們生活中很常見的東西,我們的總電源開關就是一個circuit breaker,當它的電流太大時,它就會自動切斷電源,來保護設備以防發生火災。
而我們軟體中,也是類似的保護措施。
當我們的系統運作正常時,Circuit Breaker關閉,流量會正常發送到app上,道路是暢通的。
如果一段時間內系統檢測到多次請求失敗或延遲過高,Circuit Breaker會開啟,阻止新的請求到app。這樣做可以防止故障擴大,並讓系統進入恢復期,才不會一直有錯誤新增。
例如DB已經斷線了,那麼就不應該發送更新資料請求過去,以免造成更多更多的狀態不同步問題。
在一段時間恢復後,Circuit Breaker會允許少量的請求到app,來檢測故障是否已經被修復了,如果這些請求成功,Circuit Breaker會變成closed狀態,如果還是失敗了,則重新回到open狀態。
它與retry都是處理失敗請求的策略,都會重新送流量過去到app,retry比較適合短時間的網路問題,失敗了就多送幾次直到它成功XD
我們總不能無限的retry吧,因此就有Circuit Breaker,如果失敗太多次,就關閉起來,等一段時間後,再看看它有沒有修復成功(Half -open),如果成功就會變成closed。
我們今天了解了Circuit Breaker的功能,讓我們的系統可以避免資源過載,並且讓系統多一點彈性,增加使用者的體驗。
https://learn.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker